#include "include/muduo/net/TcpClient.h"
#include "include/muduo/net/TcpConnection.h"
#include "include/muduo/net/EventLoopThread.h"
#include "include/muduo/net/Buffer.h"
#include "include/muduo/net/InetAddress.h"
#include "include/muduo/base/CountDownLatch.h"
#include <iostream>
#include <functional>

// 翻译客户端类，用于与服务器建立TCP连接并发送/接收消息
class TranslateClient
{
public:
    // 构造函数：初始化客户端并设置回调函数
    TranslateClient(const std::string &server_ip, int server_port)
        : _latch(1),  // 用于等待连接建立的倒计时锁
          _client(_loopthread.startLoop(), muduo::net::InetAddress(server_ip, server_port), "TranslateClient")
    {
        // 设置连接建立/断开时的回调函数
        _client.setConnectionCallback(std::bind(&TranslateClient::onConnection, this, std::placeholders::_1));
        // 设置收到消息时的回调函数
        _client.setMessageCallback(std::bind(&TranslateClient::onMessage, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
    }
    
    // 连接到服务器并等待连接建立完成
    void connect()
    {
        _client.connect();  // 发起连接
        _latch.wait();      // 阻塞直到连接建立完成
    }
    
    // 向服务器发送消息
    bool send(const std::string &msg)
    {
        // 检查连接是否存在且处于连接状态
        if (_conn && _conn->connected())
        {
            _conn->send(msg);  // 通过TCP连接发送消息
            return true;
        }
        return false;  // 连接不存在或已断开时返回失败
    }

private:
    // 连接状态变化时的回调函数
    void onConnection(const muduo::net::TcpConnectionPtr &conn)
    {
        if (conn->connected())
        {
            // 连接成功建立
            std::cout << "已连接到服务器" << std::endl;
            _latch.countDown();  // 通知连接已建立
            _conn = conn;        // 保存连接指针
        }
        else
        {
            // 连接已断开
            std::cout << "与服务器的连接已断开" << std::endl;
            _conn.reset();       // 释放连接指针
        }
    }
    
    // 收到服务器消息时的回调函数
    void onMessage(const muduo::net::TcpConnectionPtr &conn, muduo::net::Buffer *buf, muduo::Timestamp)
    {
        // 从缓冲区中提取所有数据并打印
        std::cout << "收到服务器消息: " << buf->retrieveAllAsString() << std::endl;
    }

private:
    muduo::CountDownLatch _latch;            // 用于同步连接建立的倒计时锁
    muduo::net::EventLoopThread _loopthread; // 事件循环线程，处理网络事件
    muduo::net::TcpClient _client;           // TCP客户端对象
    muduo::net::TcpConnectionPtr _conn;      // TCP连接指针
};

int main()
{
    // 创建翻译客户端实例，连接到本地8085端口的服务器
    TranslateClient client("127.0.0.1", 8085);
    client.connect();  // 建立连接
    
    std::cout << "已连接到翻译服务器，请输入要翻译的内容（输入exit退出）" << std::endl;
    
    while (1)
    {
        std::string input;
        std::getline(std::cin, input);  // 读取整行输入
        
        // 检查是否退出
        if (input == "exit")
            break;
            
        // 发送消息到服务器
        if (!client.send(input))
        {
            std::cout << "发送失败：连接已断开" << std::endl;
            break;
        }
    }
    
    return 0;
}